package com.taiyuan.tongcheng.map;

import android.app.Activity;
import android.graphics.Point;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BaiduMap.OnMapStatusChangeListener;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.core.PoiInfo;
import com.baidu.mapapi.search.core.SearchResult;
import com.baidu.mapapi.search.geocode.GeoCodeResult;
import com.baidu.mapapi.search.geocode.GeoCoder;
import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;
import com.taiyuan.tongcheng.application.AppContext;
import com.tytc56.user.R;

/**
 *
 * 1 创建地图布局 ，屏幕中间加入imageview控件（maker图标）
 * 2 地图初始化，定义地图操作工具BaiduMap(地图对象的操作方法与接口)
 * 3 当前地图实现地图状态改变相关接口，实现接口 BaiduMap.OnMapStatusChangeListener（）
 *   onMapStatusChange(MapStatus status)地图状态变化中
 *   onMapStatusChangeFinish(MapStatus status)地图状态改变结束
 *   onMapStatusChangeStart(MapStatus status)手势操作地图，设置地图状态等操作导致地图状态开始改变。
 * 4 用到的是Projection 类，该类的描述是（屏幕像素点坐标系统和地球表面经纬度点坐标系统之间的变换），fromScreenLocation(Point point) 这个方法可以将将屏幕坐标转换成地理坐标，point像素点
 * 5 用到BaiduMap 中的方法 Projection getProjection()获取地图投影坐标转换器, 当地图初始化完成之前返回 null，在 OnMapLoadedCallback.onMapLoaded() 之后才能正常
返回:地图投影坐标转换器
* @Description 地图选点界面
* 
* 类 GeoCoder（地理编码查询接口）
* 	destroy()释放该地理编码查询对象
* boolean	geocode(GeoCodeOption option)发起地理编码(地址信息->经纬度)请求
* static GeoCoder	newInstance()新建地理编码查询
* boolean	reverseGeoCode(ReverseGeoCodeOption option)发起反地理编码请求(经纬度->地址信息)
* void	setOnGetGeoCodeResultListener(OnGetGeoCoderResultListener listener)设置查询结果监听者
* @author wzq
* @date 2015-7-27 上午11:40:02
* @update (date)
* @version V1.0
 */
public class MapAddSActivity extends Activity implements OnMapStatusChangeListener,OnGetGeoCoderResultListener{
	
	// 定位相关
	LocationClient mLocClient;
	BitmapDescriptor mCurrentMarker;
	MarkerOptions markerOptions;
	MapView mMapView;  //地图view
	BaiduMap mBaiduMap; //百度工具
	private GeoCoder geoCoder;
	Marker marker;
	boolean isFirstLoc = true;// 是否首次定位
	
	private TextView addTv;
	public MyLocationListenner myListener = new MyLocationListenner();
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_map_select);
		// 地图初始化
		mMapView = (MapView)this.findViewById(R.id.mapview_add);
//		addTv=(TextView)this.findViewById(R.id.tv_current_add);
		mBaiduMap = mMapView.getMap();
		// 初始化搜索模块，注册事件监听
		geoCoder = GeoCoder.newInstance();
		geoCoder.setOnGetGeoCodeResultListener(this);
		mBaiduMap.setOnMapStatusChangeListener(this);//增加监听
		
		//==============定位=======================
		
		// 开启定位图层
		mBaiduMap.setMyLocationEnabled(true);
		// 定位初始化
		mLocClient = new LocationClient(getApplicationContext());
		mLocClient.registerLocationListener(myListener);
		//设置缩放级别
		MapStatusUpdate u = MapStatusUpdateFactory.zoomTo(16);
		mBaiduMap.animateMapStatus(u);
		
		LocationClientOption option = new LocationClientOption();
		option.setOpenGps(true);// 打开gps
		option.setCoorType("bd09ll"); // 设置坐标类型
		option.setScanSpan(1000);
		mLocClient.setLocOption(option);
		mLocClient.start();
		
		
}

		

	@Override
	protected void onPause() {
		mMapView.onPause();
		super.onPause();
	}

	@Override
	protected void onResume() {
		mMapView.onResume();
		super.onResume();
	}

	@Override
	protected void onDestroy() {
		// 退出时销毁定位
		mLocClient.stop();
		// 关闭定位图层
		mBaiduMap.setMyLocationEnabled(false);
		mMapView.onDestroy();
		mMapView = null;
		super.onDestroy();
	}

	/**
	 * 定位SDK监听函数
	 */
	public class MyLocationListenner implements BDLocationListener {

		@Override
		public void onReceiveLocation(BDLocation location) {
			// map view 销毁后不在处理新接收的位置
			if (location == null || mMapView == null)
				return;
			MyLocationData locData = new MyLocationData.Builder()
					.accuracy(location.getRadius())
					// 此处设置开发者获取到的方向信息，顺时针0-360
					.direction(100).latitude(location.getLatitude())
					.longitude(location.getLongitude()).build();
			mBaiduMap.setMyLocationData(locData);
			if (isFirstLoc) {
				isFirstLoc = false;
				LatLng ll = new LatLng(location.getLatitude(),
						location.getLongitude());
				MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
				mBaiduMap.animateMapStatus(u);
			}
		}

		public void onReceivePoi(BDLocation poiLocation) {
		}
	}
	
	
	

	@Override
	public void onMapStatusChange(MapStatus arg0) {
		// 获取到中心坐标点的经纬度
		
	}
	
	@Override
	public void onMapStatusChangeFinish(MapStatus arg0) {
		
	}

	@Override
	public void onMapStatusChangeStart(MapStatus arg0) {
		LatLng currentLat = mBaiduMap.getProjection().fromScreenLocation(
				new Point(AppContext.screenW/2,AppContext.screenH/2));
		geoCoder.reverseGeoCode(new ReverseGeoCodeOption()
		.location(currentLat));
	}

	
	@Override
	public void onGetGeoCodeResult(GeoCodeResult arg0) {
		
	}


	@Override
	public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {

		if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
			Toast.makeText(MapAddSActivity.this, "抱歉，未能找到结果", Toast.LENGTH_LONG)
					.show();
			return;
		}
		
//		  AddressComponent  Addresult=result.getAddressDetail();
		
//		  addTv.setText(Addresult.city+Addresult.street+Addresult.streetNumber);
		 PoiInfo info=result.getPoiList().get(0);
		 addTv.setText(info.address+info.name);
		

	
		
	}




}
